<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>总结Vue数据监测</title>
  <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>

<!--
    Vue监测数据的原理：
      1.vue会监测data中所有层次的数据
      2.如何监测对象中的数据？
        通过setter实现数据监视，且要在new Vue时就传入要监测的数据。
        （1）对象中后追加的属性，Vue默认不做响应式处理
        （2）如需给后添加的属性做响应式，请使用如下API：
            Vue.set(target,propertyName/index,value)
            vm.$set(target,propertyName/index,value)
      3.如何监测数组中的数据？
        通过包裹数组更新元素的方法实现，本质就是做了俩件事：
        （1）调用原生对应的方法对数组进行更新
        （2）重新解析模版，进而更新页面
      4.在Vue修改数组中的某个元素一定要用如下方法：
        （1）使用这些API：push()/pop()/shift()/unshift()/splice()/sort()/reverse()
             a. array.push(item1, item2, …, itemX)可以将一个或者更多的参数添加在数组的尾部；返回添加后的数组的长度，原数组发生改变
             b. array.pop()从数组尾部删除一个元素；返回这个被删除的元素，原数组发生改变
             c. array.shift()从数组头部删除一个元素；返回这个被删除的元素，原数组发生改变。
             d. array.unshift(item1,item2, …, itemX)可以将一个或者更多的参数添加在数组的头部；返回添加后的数组的长度，原数组发生改变.
             e. array.splice(start,n,item1,…,itemX)
                没有参数，返回空数组，原数组不变；
                一个参数，从该参数表示的索引位开始截取，直至数组结束，返回截取的数组，原数组改变；
                两个参数，第一个参数表示开始截取的索引位，第二个参数表示截取的长度，返回截取的数组，原数组改变；
                三个或者更多参数，第三个及以后的参数表示要从截取位插入的值。
                f. array.slice(start, end)
                   如果不传参数，会返回原数组；
                   如果一个参数，从该参数表示的索引开始截取，直至数组结束，返回这个截取数组，原数组不变；
                   两个参数，从第一个参数对应的索引开始截取，到第二个参数对应的索引结束，但不包括第二个参数对应的索引上的值，原数组不改变
             g. array.sort(sortFunction)用于对数组的元素进行排序。
             h. array.reverse()用于颠倒数组中元素的顺序

        （2）使用新数组去替换旧数组
        （3）Vue.set()/vm.$set()
      5.特别注意
        Vue.set()和vm.$set()不能给vm或vm的根数据对象添加属性
-->

<!-- 准备好一个容器-->
<div id="root">
  <h1>学生信息</h1>
  <button @click="student.age++">年龄+1岁</button>
  <br/>
  <button @click="addSex">添加性别属性，默认值：男</button>
  <br/>
  <button @click="addFriend">在列表首位添加一个朋友</button>
  <br/>
  <button @click="updateFirstStudentName">修改第一个朋友的名字为：张三</button>
  <br/>
  <button @click="addHobby">添加一个爱好</button>
  <br/>
  <button @click="updateFirstHobby">修改一个爱好为：开车</button>
  <br/>
  <button @click="removeSmoke">删除抽烟爱好</button>
  <br/>
  <h2>姓名：{{student.name}}</h2>
  <h2 v-if="student.sex">性别：{{student.sex}}</h2>
  <h2>年龄：{{student.age}}</h2>
  <h2>爱好：</h2>
  <ul>
    <li v-for="(f,index) in student.hobby" :key="index">{{f}}</li>
  </ul>
  <h2>朋友们</h2>
  <ul>
    <li v-for="(f,index) in student.friends" :key="index">
      {{f.name}}--{{f.age}}
    </li>
  </ul>


</div>
</body>
<script type="text/javascript">
  Vue.config.productionTip = false

  const vm = new Vue({
    el: '#root',
    data: {
      name: '尚硅谷',
      address: '北京',
      student: {
        name: 'tom',
        age: 18,
        friends: [{
          name: 'jerry',
          age: 35
        }, {
          name: 'tony',
          age: 36
        }],
        hobby: [
          '抽烟', '喝酒', '烫头'
        ]

      }
    },
    watch: {},
    computed: {},
    methods: {
      addSex() {
        this.$set(this.student, 'sex', '男')
      },
      addFriend() {
        this.student.friends.unshift({name:'jack',age:70})
      },
      updateFirstStudentName(){
        this.student.friends[0].name='张三'
      },
      addHobby(){
        this.student.hobby.push('学习')
      },
      updateFirstHobby(){
        // this.$set(this.student.hobby,0,'开车')
        // Vue.set(this.student.hobby,0,'开车')
        this.student.hobby.splice(0,1,'开车')
      },
      removeSmoke(){
        this.student.hobby= this.student.hobby.filter((h)=>{
          return h!=='抽烟'
        })
      }


    },
  })
</script>
</html>